/* Hausaufgabe 1
Pascalsches Dreieck mit Rekursion */

.data
z: .long 6
s: .long 2
output: .string "%d\n"

.text
.globl main
main:
// Zeile und Spalte in Register speichern
movl z, %eax
movl s, %ebx
movl $0, %ecx

// s und z auf dem Stack sichern
pushl %eax
pushl %ebx
// Platz für Rückgabewert
subl $4, %esp

//movl $0, 4(%esp)

// p(z, s) berechnen
call pas

popl %eax
addl $8, %esp

// Ergebnis ausgeben
pushl %ecx
pushl $output

call printf

addl $8, %esp

movl $1, %eax
int $0x80

// p(z, s) berechnen
pas:
// Basepointer sichern
pushl %ebp
// Stack -> Base
movl %esp, %ebp

movl 16(%ebp), %eax
movl 12(%ebp), %ebx

cmpl $1, %ebx // wenn s = 1
je end
cmpl %eax, %ebx // wenn s = z
je end

// p(z-1, s)+p(z-1, s-1)
// p(z-1, s)
decl %eax

pushl %eax
pushl %ebx
subl $4, %esp

call pas

addl $4, %esp
popl %ebx
popl %eax

// p(z-1, s-1)
decl %ebx

pushl %eax
pushl %ebx
subl $4, %esp

call pas

addl $4, %esp
popl %ebx
popl %eax

movl %eax, 8(%esp)
popl %ebp
ret

end:
movl $1, 8(%esp)
addl $1, %ecx
popl %ebp
ret
